import os
import re
from datetime import datetime
from typing import List

class FileManager:
    """文件管理类，用于统一命名和目录管理"""
    
    def __init__(self):
        self.counter = 1
        self.name_pattern = re.compile(r'[^\w\-_\.]')  # 文件名清理正则
    
    def generate_filename(self, file_path: str, prefix: str = "video") -> str:
        """
        生成统一的文件名
        
        Args:
            file_path: 原始文件路径
            prefix: 文件名前缀
            
        Returns:
            str: 生成的文件名（不含扩展名）
        """
        # 获取原始文件名（不含扩展名）
        base_name = os.path.splitext(os.path.basename(file_path))[0]
        
        # 清理文件名，移除特殊字符
        clean_name = self.name_pattern.sub('_', base_name)
        
        # 如果清理后的名称为空，使用默认前缀
        if not clean_name.strip():
            clean_name = prefix
        
        # 添加序号确保唯一性
        filename = f"{clean_name}_{self.counter:03d}"
        self.counter += 1
        
        return filename
    
    def create_output_structure(self, output_folder: str) -> dict:
        """
        创建输出目录结构
        
        Args:
            output_folder: 输出根目录
            
        Returns:
            dict: 创建的目录路径
        """
        try:
            # 创建主输出目录
            os.makedirs(output_folder, exist_ok=True)
            
            # 创建子目录
            audio_dir = os.path.join(output_folder, 'audio')
            video_dir = os.path.join(output_folder, 'video')
            subtitles_dir = os.path.join(output_folder, 'subtitles')
            logs_dir = os.path.join(output_folder, 'logs')
            
            os.makedirs(audio_dir, exist_ok=True)
            os.makedirs(video_dir, exist_ok=True)
            os.makedirs(subtitles_dir, exist_ok=True)
            os.makedirs(logs_dir, exist_ok=True)
            
            return {
                'root': output_folder,
                'audio': audio_dir,
                'video': video_dir,
                'subtitles': subtitles_dir,
                'logs': logs_dir
            }
            
        except Exception as e:
            raise Exception(f"创建输出目录结构失败: {str(e)}")
    
    def get_output_paths(self, base_name: str, output_folder: str) -> dict:
        """
        获取输出文件路径
        
        Args:
            base_name: 基础文件名
            output_folder: 输出文件夹
            
        Returns:
            dict: 输出文件路径
        """
        # 确保目录结构存在
        dirs = self.create_output_structure(output_folder)
        
        return {
            'audio': os.path.join(dirs['audio'], f"{base_name}.mp3"),
            'video': os.path.join(dirs['video'], f"{base_name}.mp4"),
            'subtitles': os.path.join(dirs['subtitles'], f"{base_name}.srt")
        }
    
    def validate_output_path(self, file_path: str) -> bool:
        """
        验证输出路径是否有效
        
        Args:
            file_path: 文件路径
            
        Returns:
            bool: 路径是否有效
        """
        try:
            # 检查目录是否可写
            dir_path = os.path.dirname(file_path)
            if not os.path.exists(dir_path):
                os.makedirs(dir_path, exist_ok=True)
            
            # 尝试创建测试文件
            test_file = os.path.join(dir_path, '.test_write')
            with open(test_file, 'w') as f:
                f.write('test')
            os.remove(test_file)
            
            return True
            
        except Exception:
            return False
    
    def get_file_size(self, file_path: str) -> int:
        """
        获取文件大小
        
        Args:
            file_path: 文件路径
            
        Returns:
            int: 文件大小（字节）
        """
        try:
            return os.path.getsize(file_path)
        except OSError:
            return 0
    
    def format_file_size(self, size_bytes: int) -> str:
        """
        格式化文件大小显示
        
        Args:
            size_bytes: 文件大小（字节）
            
        Returns:
            str: 格式化的文件大小
        """
        if size_bytes == 0:
            return "0 B"
        
        size_names = ["B", "KB", "MB", "GB", "TB"]
        i = 0
        while size_bytes >= 1024 and i < len(size_names) - 1:
            size_bytes /= 1024.0
            i += 1
        
        return f"{size_bytes:.1f} {size_names[i]}"
    
    def cleanup_temp_files(self, temp_files: List[str]) -> bool:
        """
        清理临时文件
        
        Args:
            temp_files: 临时文件路径列表
            
        Returns:
            bool: 是否成功清理
        """
        success = True
        for temp_file in temp_files:
            try:
                if os.path.exists(temp_file):
                    os.remove(temp_file)
            except Exception:
                success = False
        
        return success
    
    def create_processing_log(self, output_folder: str, results: List[dict]) -> str:
        """
        创建处理日志
        
        Args:
            output_folder: 输出文件夹
            results: 处理结果列表
            
        Returns:
            str: 日志文件路径
        """
        try:
            # 确保日志目录存在
            logs_dir = os.path.join(output_folder, 'logs')
            os.makedirs(logs_dir, exist_ok=True)
            
            # 生成日志文件名
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            log_file = os.path.join(logs_dir, f"processing_log_{timestamp}.txt")
            
            # 写入日志内容
            with open(log_file, 'w', encoding='utf-8') as f:
                f.write("音视频分离处理日志\n")
                f.write("=" * 50 + "\n")
                f.write(f"处理时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                f.write(f"输出目录: {output_folder}\n")
                f.write(f"处理文件数: {len(results)}\n\n")
                
                # 统计信息
                successful = sum(1 for r in results if r.get('success', False))
                failed = len(results) - successful
                
                f.write(f"成功处理: {successful} 个文件\n")
                f.write(f"处理失败: {failed} 个文件\n\n")
                
                # 详细结果
                f.write("详细处理结果:\n")
                f.write("-" * 30 + "\n")
                
                for i, result in enumerate(results, 1):
                    f.write(f"\n{i}. {os.path.basename(result.get('input_file', 'Unknown'))}\n")
                    f.write(f"   状态: {'成功' if result.get('success', False) else '失败'}\n")
                    
                    if result.get('audio_extracted'):
                        f.write(f"   音频: {os.path.basename(result.get('audio_output', ''))}\n")
                    
                    if result.get('video_converted'):
                        f.write(f"   视频: {os.path.basename(result.get('video_output', ''))}\n")
                    
                    if result.get('errors'):
                        f.write(f"   错误: {', '.join(result['errors'])}\n")
            
            return log_file
            
        except Exception as e:
            raise Exception(f"创建处理日志失败: {str(e)}")
    
    def reset_counter(self):
        """重置文件计数器"""
        self.counter = 1 